package com.estagio.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.Cargo;
import com.estagio.entity.Cidade;
import com.estagio.entity.Estado;
import com.estagio.entity.Funcionario;
import com.estagio.entity.Modalidade;
import com.estagio.entity.ProfessorAula;
import com.estagio.session.CargoSession;
import com.estagio.session.CidadeSession;
import com.estagio.session.FuncionarioSession;
import com.estagio.session.ModalidadeSession;

@ManagedBean(name="funcionarioBean")
@SessionScoped
public class FuncionarioBean {
	
	//ESTADO
	private Funcionario funcionario = new Funcionario();
	private Funcionario funcionarioSave = new Funcionario();
	private Funcionario funcionarioSelecionado;
	private String mensagem;
	private DataModel dmFuncionario;
	
	//CIDADE
	private Cidade cidade = new Cidade();
	private Cidade cidadeSelecionado = new Cidade();
	private Cidade cidadeFuncionario = new Cidade();
	private DataModel dmCidade;	
	
	//CARGO
	private Cargo cargo = new Cargo();
	private Cargo cargoSave = new Cargo();
	private Cargo cargoSelecionado = new Cargo();
	private DataModel dmCargo;
	
	//MODALIDADE
	private Modalidade modalidade = new Modalidade();
	private Modalidade modalidadeSave = new Modalidade();
	private DataModel dmModalidade;
	private Modalidade modalidadeSelecionada = new Modalidade();
	
	//PROFESSORAULAS
	private ProfessorAula professorAula = new ProfessorAula();
	private DataModel dmProfessorAula;
	private List<ProfessorAula> arrayAula;
	private Modalidade modalidadeTeste = new Modalidade();
	
	//DIALOG PROFESSOR (ANAMNESE)
	private List<Funcionario> listaProfessor;
	
	public FuncionarioBean() {
		this.funcionario.setCidade(new Cidade());
		this.cidadeFuncionario = new Cidade();
	}


	//GETTERS AND SETTERS	
	
	
	public Funcionario getFuncionarioSave() {
		return funcionarioSave;
	}

	public List<Funcionario> getListaProfessor() {
		return listaProfessor;
	}


	public void setListaProfessor(List<Funcionario> listaProfessor) {
		this.listaProfessor = listaProfessor;
	}


	public Modalidade getModalidadeTeste() {
		return modalidadeTeste;
	}


	public void setModalidadeTeste(Modalidade modalidadeTeste) {
		this.modalidadeTeste = modalidadeTeste;
	}


	public List<ProfessorAula> getArrayAula() {
		return arrayAula;
	}


	public void setArrayAula(List<ProfessorAula> arrayAula) {
		this.arrayAula = arrayAula;
	}


	public ProfessorAula getProfessorAula() {
		return professorAula;
	}


	public void setProfessorAula(ProfessorAula professorAula) {
		this.professorAula = professorAula;
	}


	public DataModel getDmProfessorAula() {
		return dmProfessorAula;
	}


	public void setDmProfessorAula(DataModel dmProfessorAula) {
		this.dmProfessorAula = dmProfessorAula;
	}


	public Modalidade getModalidadeSelecionada() {
		return modalidadeSelecionada;
	}


	public void setModalidadeSelecionada(Modalidade modalidadeSelecionada) {
		this.modalidadeSelecionada = modalidadeSelecionada;
	}


	public Modalidade getModalidade() {
		return modalidade;
	}

	public void setModalidade(Modalidade modalidade) {
		this.modalidade = modalidade;
	}	

	public Modalidade getModalidadeSave() {
		return modalidadeSave;
	}

	public void setModalidadeSave(Modalidade modalidadeSave) {
		this.modalidadeSave = modalidadeSave;
	}


	public DataModel getDmModalidade() {
		return dmModalidade;
	}


	public void setDmModalidade(DataModel dmModalidade) {
		this.dmModalidade = dmModalidade;
	}


	public void setFuncionarioSave(Funcionario funcionarioSave) {
		this.funcionarioSave = funcionarioSave;
	}

	public Cidade getCidadeFuncionario() {
		return cidadeFuncionario;
	}

	public void setCidadeFuncionario(Cidade cidadeFuncionario) {
		this.cidadeFuncionario = cidadeFuncionario;
	}

	public Cidade getCidadeSelecionado() {
		return cidadeSelecionado;
	}

	public void setCidadeSelecionado(Cidade cidadeSelecionado) {
		this.cidadeSelecionado = cidadeSelecionado;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}
	
	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Funcionario getFuncionarioSelecionado() {
		return funcionarioSelecionado;
	}

	public void setFuncionarioSelecionado(Funcionario funcionarioSelecionado) {
		this.funcionarioSelecionado = funcionarioSelecionado;
	}

	public DataModel getDmFuncionario() {
		return dmFuncionario;
	}


	public void setDmFuncionario(DataModel dmFuncionario) {
		this.dmFuncionario = dmFuncionario;
	}


	public DataModel getDmCidade() {
		return dmCidade;
	}


	public void setDmCidade(DataModel dmCidade) {
		this.dmCidade = dmCidade;
	}


	public Cargo getCargo() {
		return cargo;
	}


	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}


	public Cargo getCargoSave() {
		return cargoSave;
	}


	public void setCargoSave(Cargo cargoSave) {
		this.cargoSave = cargoSave;
	}


	public Cargo getCargoSelecionado() {
		return cargoSelecionado;
	}


	public void setCargoSelecionado(Cargo cargoSelecionado) {
		this.cargoSelecionado = cargoSelecionado;
	}


	public DataModel getDmCargo() {
		return dmCargo;
	}


	public void setDmCargo(DataModel dmCargo) {
		this.dmCargo = dmCargo;
	}


	//METODOS FUNCIONARIO


	public void saveFuncionario() {
		FuncionarioSession funcionarioRN = new FuncionarioSession();
		Funcionario funcionario = this.funcionarioSave;		
		this.mensagem = funcionarioRN.save(funcionario, this.arrayAula);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}


	public String deleteFuncionario() {
		FuncionarioSession funcionarioRN = new FuncionarioSession();		
		Funcionario funcionario = this.funcionarioSave;
		this.mensagem = funcionarioRN.delete(funcionario);
		this.funcionarioSave = new Funcionario();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarFuncionario";
	}

	public DataModel findFuncionario() {
		FuncionarioSession funcionarioSession = new FuncionarioSession();
		this.funcionario = new Funcionario();
		List<Funcionario> lista = funcionarioSession.find(this.funcionario, null);
//		System.out.println("array no find funcionarioBean: " + lista.size());
		this.dmFuncionario = new ListDataModel(lista);
		return this.dmFuncionario;
	}
	
	public void clean() {
		this.funcionario = new Funcionario();
	}
	

	//CIDADE
	public void saveCidade() {
		CidadeSession cidadeSession = new CidadeSession();
		Cidade cidade = this.cidade;		
		this.mensagem = cidadeSession.save(cidade);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}

	public String deleteCidade() {
		CidadeSession cidadeRN = new CidadeSession();		
		Cidade cidade = this.cidadeSelecionado;
		this.mensagem = cidadeRN.delete(cidade);
		this.cidadeSelecionado = new Cidade();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarCidade";
	}

	public DataModel findCidade() {
		RequestContext.getCurrentInstance().update("panelDialogConsultarCidade");		
		
		List<Cidade> listaCidade = new CidadeSession().find(this.cidade);
		this.dmCidade = new ListDataModel(listaCidade);
		return this.dmCidade;
	}
	
	public void selectCidade() {
		Cidade cidadeAux = (Cidade) this.dmCidade.getRowData();
		
		System.out.println("cidade datamodel: " + cidadeAux.getDescricao());
		this.funcionarioSave.setCidade(cidadeAux);

		System.out.println("idcidade funcionarioSave: " + this.funcionarioSave.getCidade().getIdCidade());
		System.out.println("cidade funcionarioSave: " + this.funcionarioSave.getCidade().getDescricao());
		
		RequestContext.getCurrentInstance().update("pgCidadeFuncionario");
		RequestContext.getCurrentInstance().execute("dialogConsultarCidade.hide()");
	}
	
	//DIALOG CARGO
	
	public void saveCargo() {
		CargoSession cargoSession = new CargoSession();
		Cargo cargo = this.cargo;		
		this.mensagem = cargoSession.save(cargo);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}

	public String deleteCargo() {
		CargoSession cargoRN = new CargoSession();		
		Cargo cargo = this.cargoSelecionado;
		this.mensagem = cargoRN.delete(cargo);
		this.cargoSelecionado = new Cargo();
		this.cargo = new Cargo();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarCargo";
	}

	public DataModel findCargo() {
		List<Cargo> listaCargo = new CargoSession().find(this.cargo);
		this.dmCargo = new ListDataModel(listaCargo);
		return this.dmCargo;
	}
	
	public void selectCargo() {
		Cargo cargoAux = (Cargo) this.dmCargo.getRowData();
		
		System.out.println("cargo datamodel: " + cargoAux.getCargo());
		this.funcionarioSave.setCargo(cargoAux);

		System.out.println("idcargo funcionarioSave: " + this.funcionarioSave.getCargo().getIdCargo());
		System.out.println("cargo funcionarioSave: " + this.funcionarioSave.getCargo().getCargo());
		this.renderedAddAula();
		RequestContext.getCurrentInstance().update("panelGroupCargo");
		RequestContext.getCurrentInstance().execute("dialogConsultarCargo.hide()");
	}
	
	//FIM DIALOG CARGO
	
	//DIALOG AULAS
	public void saveModalidade() {
		ModalidadeSession modalidadeSession = new ModalidadeSession();
		Modalidade modalidade = this.modalidade;		
		this.mensagem = modalidadeSession.save(modalidade);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}

	public String deleteModalidade() {
		ModalidadeSession modalidadeRN = new ModalidadeSession();		
		Modalidade modalidade = this.modalidadeSelecionada;
		this.mensagem = modalidadeRN.delete(modalidade);
		this.modalidadeSelecionada = new Modalidade();
		this.modalidade = new Modalidade();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarModalidade";
	}

	public DataModel findModalidade() {
		List<Modalidade> listaModalidade = new ModalidadeSession().find(this.modalidade);
		this.dmModalidade = new ListDataModel(listaModalidade);
		return this.dmModalidade;
	}
	
	public void addModalidade() {
		System.out.println(this.modalidade.getDescricao());
		this.professorAula.setModalidade((Modalidade) this.dmModalidade.getRowData());
		
		RequestContext.getCurrentInstance().update("pgDialogAddAula");
		RequestContext.getCurrentInstance().execute("dialogConsultarModalidade.hide()");
	}
	
	public void addAula() {	
		if(this.arrayAula == null) {
			this.arrayAula = new ArrayList<ProfessorAula>();
		}
		System.out.println("tamanho do array = " + this.arrayAula.size());
		ProfessorAula auxAula = this.professorAula;
		for (ProfessorAula aux : this.arrayAula) {
			ProfessorAula aux2 = aux;
			System.out.println("arrayAula modalidade: " + aux2.getModalidade().getDescricao());
			System.out.println("arrayAula salario: " + aux2.getSalario());
		}
//		auxAula.setModalidade(this.modalidadeTeste);
		this.arrayAula.add(auxAula);


		System.out.println("Modalidade professorAula: " + this.professorAula.getModalidade().getDescricao() + " - posicao: " + this.arrayAula.size());
		System.out.println("Salario professorAula: " + this.professorAula.getSalario());
		this.professorAula = new ProfessorAula();
		RequestContext.getCurrentInstance().update("tableAulas");
		RequestContext.getCurrentInstance().execute("dialogAddAula.hide()");
		
		
	}
	
	
	//FIM DIALO AULAS
	
	//INVOCAR TELAS
	public String newFuncionario() {
		this.funcionarioSave = new Funcionario();
		this.funcionarioSave.setCidade(new Cidade());
		this.funcionarioSave.getCidade().setEstado(new Estado());
		this.funcionarioSave.setCargo(new Cargo());
		this.arrayAula = new ArrayList<ProfessorAula>();
		return "manterFuncionario";
	}
	
	public Boolean renderedAddAula() {

		if(this.funcionarioSave.getCargo() == null) {
			return false;
		} else {
			if(this.funcionarioSave.getCargo().getIdCargo() == null) {
				return false;
			} else {
				if(this.funcionarioSave.getCargo().getIdCargo() == 1) {// 1 - professor
					return true;
				} else {
					return false;
				}
			}
		}
	}
	
	//METODOS DIALOGS	
	public void findProfessor() {
		FuncionarioSession session = new FuncionarioSession();
		Cargo cargo = new Cargo();
		cargo.setIdCargo(1);
		this.listaProfessor = session.find(this.funcionario, cargo);
	}
	
	public String consultarFuncionario() {
		return "consultarFuncionario";
	}

	public String editarFuncionario() {
		this.funcionarioSave = (Funcionario) this.dmFuncionario.getRowData();		
		return "editarFuncionario";
	}
	
	public String excluirFuncionario() {
		this.funcionarioSave = (Funcionario) this.dmFuncionario.getRowData();
		return "excluirFuncionario";
	}
	
	//DIALOGS
	public void openDialogConsultarFuncionario() {
		RequestContext.getCurrentInstance().update("idDialogConsultarFuncionario");
		RequestContext.getCurrentInstance().execute("dialogConsultarFuncionario.show()");
	}
	
	public void openDialogManterFuncionario() {
		this.funcionarioSave = new Funcionario();
		RequestContext.getCurrentInstance().update("idDialogManterFuncionario");
		RequestContext.getCurrentInstance().execute("dialogManterFuncionario.show()");
	}

	public void openDialogConsultarCidade() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCidade");
		RequestContext.getCurrentInstance().execute("dialogConsultarCidade.show()");
	}
	
	public void openDialogConsultarCargo() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCargo");
		RequestContext.getCurrentInstance().execute("dialogConsultarCargo.show()");
	}
	
	public void openDialogAddAulas() {
		this.professorAula.setModalidade(new Modalidade());
		this.professorAula.setFuncionario(new Funcionario());
		RequestContext.getCurrentInstance().update("idDialogAddAula");
		RequestContext.getCurrentInstance().execute("dialogAddAula.show()");
	}
	
	public void openDialogConsultarModalidade() {
		RequestContext.getCurrentInstance().update("idDialogConsultarModalidade");
		RequestContext.getCurrentInstance().execute("dialogConsultarModalidade.show()");
	}
	
}
